package json

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

const cfgPath = "readConfig/json/conf.json"

//-- 示例配置json --
//"xx":"xx"
//"spring": {
//    "redis": {
//      "host": "redis.dns.baidu.com",
//      "port": "6379",
//      "dataBase": "0",
//      "timeout": "2000"
//    }
//  }

//必须全部大写开头，防止解析报错
//
type Configuration struct {
	Enabled bool
	Path    string
	Spring  RedisEntity
}

type RedisEntity struct {
	Redis RedisData
}
type RedisData struct {
	Host     string `json:"host"`
	Port     float64
	DataBase float64
	Timeout  float64
}

/**
core api: json.NewDecoder
*/
func Main() {
	// 打开文件
	file, e := os.Open(cfgPath)
	if e != nil {
		fmt.Println("Error:", e)
	}
	// 关闭文件
	defer func() {
		_ = file.Close()
	}()

	//NewDecoder创建一个从file读取并解码json对象的*Decoder，解码器有自己的缓冲，并可能超前读取部分json数据。
	decoder := json.NewDecoder(file)

	conf := Configuration{}
	//Decode从输入流读取下一个json编码值并保存在v指向的值里
	err := decoder.Decode(&conf)
	if err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println("enabled:", conf.Enabled)
	fmt.Println("path:", conf.Spring)
}

/**
core api: json.Unmarshal(data, v)
*/
func Main2() {
	JsonParse := NewJsonStruct()
	v := Configuration{}
	//下面使用的是相对路径，config.json文件和main.go文件处于同一目录下
	JsonParse.Load(cfgPath, &v)
	fmt.Println("enabled:", v.Enabled)
	fmt.Println("database port:", v.Spring.Redis.Port)
}

type JsnStruct struct {
}

func NewJsonStruct() *JsnStruct {
	return &JsnStruct{}
}

func (jst *JsnStruct) Load(filename string, v interface{}) {
	//ReadFile函数会读取文件的全部内容，并将结果以[]byte类型返回
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return
	}

	//读取的数据为json格式，需要进行解码
	err = json.Unmarshal(data, v)
	if err != nil {
		return
	}
}
